MySQL 安装与启停 升级MySQL 数据库

1. 升级说明

升级操作是日常任务之一,你可以通过升级解决MySQL 版本来解决bug.在生产机器上要注意升级操作的流畅性。
降级操作很少用到,但是特殊时候遇到性能和兼容性问题发生时常常使用降级方式回退。当然也可以使用未被覆盖的升级前的系统。
NOTE
> 从8.0 降级到5.7 是不支持的。最好升级前备份你5.7 的数据。
> 如果需要回退则恢复备份数据即可。

2. 升级MySQL

2.1. 升级步骤

2.1.1. Upgrade Methods

2.2. 升级路径

2.3. 升级前准备

1.备份数据
impartant

从8.0 降级到5.7 是不支持的操作。所以要提前备份数据

3. 升级需求验证

  1. 必须没有过期的数据类型,过期的函数,孤立的.frm 文件。innodb 表使用非本地分区,触发器丢失或为空
    识别表和触发器是否失败可以运行以下命令
    mysqlcheck -u root -p --all-databases --check-upgrade

输出结果

Enter password: 
mysql.columns_priv                                 OK
mysql.db                                           OK
mysql.engine_cost                                  OK
mysql.event                                        OK
mysql.func                                         OK
mysql.general_log                                  OK
mysql.gtid_executed                                OK
mysql.help_category                                OK
mysql.help_keyword                                 OK
mysql.help_relation                                OK
mysql.help_topic                                   OK
mysql.innodb_index_stats                           OK
mysql.innodb_table_stats                           OK
mysql.ndb_binlog_index                             OK
mysql.plugin                                       OK
mysql.proc                                         OK
mysql.procs_priv                                   OK
mysql.proxies_priv                                 OK
mysql.server_cost                                  OK
mysql.servers                                      OK
mysql.slave_master_info                            OK
mysql.slave_relay_log_info                         OK
mysql.slave_worker_info                            OK
mysql.slow_log                                     OK
mysql.tables_priv                                  OK
mysql.time_zone                                    OK
mysql.time_zone_leap_second                        OK
mysql.time_zone_name                               OK
mysql.time_zone_transition                         OK
mysql.time_zone_transition_type                    OK
mysql.user                                         OK
sys.sys_config                                     OK
  1. 查询有没有分区表使用非本地的分区。
SELECT TABLE_SCHEMA, TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE ENGINE NOT IN ('innodb', 'ndbcluster')
AND CREATE_OPTIONS LIKE '%partitioned%';
  1. 查询有没有跟mysql 系统数据库同样的表明
SELECT TABLE_SCHEMA, TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE LOWER(TABLE_SCHEMA) = 'mysql'
and LOWER(TABLE_NAME) IN
(
'catalogs',
'character_sets',
'collations',
'column_statistics',
'column_type_elements',
'columns',
'dd_properties',
'events',
'foreign_key_column_usage',
'foreign_keys',
'index_column_usage',
'index_partitions',
'index_stats',
'indexes',
'parameter_type_elements',
'parameters',
'resource_groups',
'routines',
'schemata',
'st_spatial_reference_systems',
'table_partition_values',
'table_partitions',
'table_stats',
'tables',
'tablespace_files',
'tablespaces',
'triggers',
'view_routine_usage',
'view_table_usage'
);

如果有相同的表名,请rename table .
4. 检查外键名字是否超过64 字节

SELECT TABLE_SCHEMA, TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME IN
  (SELECT LEFT(SUBSTR(ID,INSTR(ID,'/')+1),
               INSTR(SUBSTR(ID,INSTR(ID,'/')+1),'_ibfk_')-1)
   FROM INFORMATION_SCHEMA.INNODB_SYS_FOREIGN
   WHERE LENGTH(SUBSTR(ID,INSTR(ID,'/')+1))>64);

如果有,则改为低于64 字节的外键名字。
5. 升级前确定好哪些功能是在MySQL 8.0 版本中不支持

2. 置换升级

  1. 检查升级
  2. 检查升级需求验证
  3. 确定使用XA 事物,请用XA_COMMIT ,XA ROOLLBAKCK 进行 数据提交或回滚
  4. 如果有加密表空间请使用转换key 把加密密钥转换成主密钥
ALTER INSTANCE ROTATE INNODB MASTER KEY;
  1. 设置关库模式
    innodb_fast_shutdown = 0 时 是关库最慢的方式。会等待事物结束。并且检查点一致时。才能关机。
    innodb_fast_shutdown = 1 时 默认选项。不会等待事物结束。但是会检查日志是否全部写入。并且检查点一致。
    innodb_fast_shutdown = 2 时 硬关机,相当于断电。关机最快的方法。但是下次启动时。会调用crash recovery 应急修复。
SET GLOBAL innodb_fast_shutdown = 1; -- fast shutdown
SET GLOBAL innodb_fast_shutdown = 0; -- slow shutdown

6.关闭MySQL 数据库

mysqladmin -u root -p shutdown
  1. 替换MySQL 二进制文件。
  2. 启动MySQL
systemctl start mysql
mysqld_safe --user=mysql --datadir=/app/mysql/mysql-files/

note:

如果有加密请使用加密选项指定对应密钥位置。
--early-plugin-load

如果启动成功会执行以下操作

如果此处出错了,服务会回滚所有在数据目录中的操作,在此时,应该移除所有的redo log 文件,然后启动你的MySQL 5.7 服务在同一数据文件目录下。
9. 在MySQL 8.0 服务启动成功后执行mysql_upgrade:

 mysql_upgrade -u root -p

msyql_upgrade 检查所有表和所有不相容的内容,此升级程序也会影响information_schema ,和sys 模式
10. 重启数据库生效所有选项

mysqladmin -u root -p shutdown
mysqld_safe --user=mysql --datadir=/path/to/existing-datadir
  1. 升级诊断
 mysqld --print-defaults

如果有错误参数请移除。

3. 升级MySQL 8.0 后的影响

1. 数据目录改变

MySQL 8.0 是完全由数据字典管理所有数据库对象的。而在MySQL 早期版本。是由源数据文件管理。

2. caching_sha2_password 插件

caching_sha2_password 和sha256_password 认证插件日工更安全的密码加密。mysql_native_password 插件是较不安全的加密方式。对于sha256_password 加密方式,caching_sha2_password 提供的加密方式性能更好。所以根据性能和安全的策略决定caching_sha2_password 为默认加密方式

select Host,User,plugin from user;

改变加密方式

    ALTER USER user
  IDENTIFIED WITH caching_sha2_password
  BY 'password';

2.1. caching_shar2_password 兼容性问题 解决

important

如果你的MySQL 服务于多个8.0 之前的版本的客户端。则需要设置默认加密方式

[mysqld]
default_authentication_plugin=mysql_native_password

如果不升级客户端或者添加以上内容则有可能会出现以下错误

Authentication plugin 'caching_sha2_password' is not supported
Authentication plugin 'caching_sha2_password' cannot be loaded:
dlopen(/usr/local/mysql/lib/plugin/caching_sha2_password.so, 2):
image not found
Warning: mysqli_connect(): The server requested authentication
method unknown to the client [caching_sha2_password]

2.2. 兼容的客户端

libmysqlclient  必须 8.0 以上
libmysqlclient 必须mysql 5.7 (23 和以后)
Connector/C++  1.1.11 更高
 Connector/Net 8.0.10 更高
 Connector/Node.js 8.0.9  更高
  the X DevAPI PHP extension (mysql_xdevapi)  支持caching_sha2_password.

3. 配置改变

  1. 重要改变1:
    innodb 现在为MySQL8.0 唯一的表引擎。
    innodb 支持本地分区,但是这个功能在MySQL8.0 中已经不支持了。
    其他表引擎的都要转换为innodb ,分区表 现目前改为非分区表。
    在导入dump 文件中,确保表创建语句没有为支持的数据库引擎。
  2. 重要改变2:
    默认字符集已经从latin1 改变为utf8mb4
    character_set_server 变量名改为character_set_database
    默认变量名collation_server 改为collation_database ,系统变量从latin1_swedish_ci 改为utf8mb4_0900_ai_ci。
    在replication 复制环境中,由于默认字符集改变了 可能会导致问题,所以请手动设置这两个变量
     [mysqld]
character_set_server=latin1
collation_server=latin1_swedish_ci
  1. 大小写

4. 服务改变

5. innodb 改变

4. 降级

1. 数据泵方式

mysqldump -u root -p  db_name t1 > dump.sql
mysql -u root -p db_name < dump.sql
mysqldump -u root -p --all-databases > dump.sql
mysql -u root -p db_name < dump.sql

2. alter table 方式

 ALTER TABLE t1 ENGINE = InnoDB;
SHOW CREATE TABLE

3. repair table 方式

REPAIR TABLE t1;
mysqlcheck -u root -p --repair --databases db_name ...
mysqlcheck -u root -p --repair --all-databases

5. 远程传输数据库

GRANT ALL PRIVILEGES ON *.* TO 'dsg'@'%' IDENTIFIED BY '123' WITH GRANT OPTION;
mysqladmin -h 'other_hostname' -u root -p  create db_name
mysqladmin  -h '192.168.10.141' -u dsg -p create dsg;   
mysqldump db_name | mysql -h 'other_hostname' db_name
mysqldump  -u root -p  dsg    | mysql -h '192.168.10.141' -u dsg -p  dsg;   
mysqladmin -u root -p create db_name
mysqldump -h 'other_hostname' -u root -p --compress db_name | mysql db_name
mysqldump  -u root -p  -h '192.168.10.140' --compress dsg    | mysql dsg;   
mysqldump -u root -p --quick db_name | gzip > db_name.gz
mysqldump -u root -p --quick dsg| gzip > dsg.gz
mysqladmin create  dsg
gunzip < dsg.gz | mysql db_name

1. 可以使用mysqldump 、mysqlimport 方式

这种方式更快

mkdir DUMPDIR
mysqldump -u root -p --tab=DUMPDIR db_name
mysqldump -u root -p --tab=DUMPDIR dsg

导入

mysqladmin create db_name           # create database
cat DUMPDIR/*.sql | mysql db_name   # create tables in database
mysqlimport db_name DUMPDIR/*.txt   # load data into tables